#include "prelistwid.h"
#include "const.h"
#include <QPainter>
#include <QPixmap>
#include <QDebug>
#include <QGuiApplication>
#include "protreeitem.h"
#include "prelistitem.h"

PreListWid::PreListWid(QWidget *parent)
    :QListWidget(parent)
    ,_global(0)
{
    this->setViewMode(QListWidget::IconMode);
    this->setIconSize(QSize(PREICON_SIZE,PREICON_SIZE));
    this->setSpacing(5);
    connect(this,&PreListWid::itemPressed,this,&PreListWid::SlotItemPressed);
}

void PreListWid::AddListItem(const QString &path)
{
    //这段代码主要是用来将一个图像 src_pixmap 缩放并绘制到另一个图像 dst_pixmap 上，
    //且绘制时保持原图像的纵横比，并将其居中对齐。最后，它会对目标图像进行一些处理（如填充颜色和绘制），并且增加 _global 变量的值。

    //使用指定路径 path 创建一个 QPixmap 对象 src_pixmap。这个 QPixmap 将包含从该路径加载的图像。
    QPixmap src_pixmap(path);
    //源图像 src_pixmap 会被缩放到 PREICON_SIZE 大小
    //但是 Qt::KeepAspectRatio 确保图像在缩放过程中保持原始的宽高比。即图像的纵横比不变，可能会有留白区域
    src_pixmap = src_pixmap.scaled(PREICON_SIZE,PREICON_SIZE,Qt::KeepAspectRatio);
    QPixmap dst_pixmap(QSize(PREICON_SIZE,PREICON_SIZE));
    //使用 fill() 方法将该图像填充为一个灰色背景（颜色为 220, 220, 220，透明度为 50，即半透明的灰色）。
    //这意味着目标图像的初始状态是一个带有透明灰色背景的空白画布。
    dst_pixmap.fill(QColor(220,220,220,50));
    //创建一个 QPainter 对象 painter，用于在 dst_pixmap 上进行绘制。
    QPainter painter(&dst_pixmap);
    //这些代码用来计算 src_pixmap（源图像）在 dst_pixmap（目标图像）中居中的位置。
    //x 和 y 分别是源图像在目标图像上的水平和垂直偏移量。通过这种方式，源图像会被居中绘制到目标图像上。
    auto src_width = src_pixmap.width();
    auto src_height = src_pixmap.height();
    auto dist_width = dst_pixmap.width();
    auto dist_height = dst_pixmap.height();
    auto x = (dist_width-src_width)/2;
    auto y = (dist_height-src_height)/2;
    //将缩放后的源图像 src_pixmap 绘制到目标图像 dst_pixmap 的指定位置 (x, y) 上。
    //绘制时，源图像会保持原始的纵横比，并且会在目标图像上居中显示。
    painter.drawPixmap(x,y,src_pixmap);
    _global++;
    PreListItem* pItem = new PreListItem(QIcon(dst_pixmap),path,_global,this);
    pItem->setSizeHint(QSize(PREICON_SIZE,PREICON_SIZE));
    this->addItem(pItem);
    _set_items[path]=pItem;
    if(_global == 1){
        _pos_orgin = this->pos();
    }
}

void PreListWid::SlotUpPreList(QTreeWidgetItem *tree_item)
{
    if(!tree_item){
        qDebug()<<"void PreListWid::SlotUpPreList(QTreeWidgetItem *tree_item):tree_item is empty";
        return;
    }
    auto* pro_item = dynamic_cast<ProTreeItem*>(tree_item);
    auto path = pro_item->GetPath();
    auto iter = _set_items.find(path);
    if(iter != _set_items.end()){
        qDebug()<<"void PreListWid::SlotUpPreList(QTreeWidgetItem *tree_item):path has exists";
        return;
    }
    AddListItem(path);

}

void PreListWid::SlotUpSelect(QTreeWidgetItem *tree_item)
{
    if(!tree_item){
        return;
    }
    auto* pro_item = dynamic_cast<ProTreeItem*>(tree_item);
    auto path = pro_item->GetPath();
    auto iter = _set_items.find(path);
    if(iter == _set_items.end()){
        return;
    }
    auto* list_item = dynamic_cast<PreListItem*>(iter.value());
    auto index = list_item->GetIndex();
    if(index > 17){
        auto pos_cur = this->pos();
        this->move(pos_cur.x()-(index - _last_index)*100,pos_cur.y());
    }else{
        this->move(_pos_orgin);
        _last_index = 17;
    }
    this->setCurrentItem(iter.value());
}

void PreListWid::SlotItemPressed(QListWidgetItem *item)
{
    if(QGuiApplication::mouseButtons() != Qt::LeftButton){
        return;
    }
    auto* list_item = dynamic_cast<PreListItem*>(item);
    auto cur_index = list_item->GetIndex();
    auto path = list_item->GetPath();
    this->setCurrentItem(item);
    emit SigUpSelectShow(path);//发送信号表明显示的图片的路径
}
